Skip to content

Conversation

@metamaskbot
Copy link
Collaborator

@metamaskbot metamaskbot commented Nov 6, 2025

🚀 v13.9.0 Testing & Release Quality Process

Hi Team,
As part of our new MetaMask Release Quality Process, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment.


📋 Key Processes

Testing Strategy

  • Developer Teams:
    Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows.
  • QA Team:
    Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing.
  • Customer Success Team:
    Validate new functionalities and provide feedback to support release monitoring.

GitHub Signoff

  • Each team must sign off on the Release Candidate (RC) via GitHub by the end of the validation timeline (Tuesday EOD PT).
  • Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed.

Issue Resolution

  • Resolve all Release Blockers (Sev0 and Sev1) by Tuesday EOD PT.
  • For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines.

Cherry-Picking Criteria

  • Only critical fixes meeting outlined criteria will be cherry-picked.
  • Developers must ensure these fixes are thoroughly reviewed, tested, and merged by Tuesday EOD PT.

🗓️ Timeline and Milestones

  1. Today (Friday): Begin Release Candidate validation.
  2. Tuesday EOD PT: Finalize RC with all fixes and cherry-picks.
  3. Wednesday: Buffer day for final checks.
  4. Thursday: Submit release to app stores and begin rollout to 1% of users.
  5. Monday: Scale deployment to 10%.
  6. Tuesday: Full rollout to 100%.

✅ Signoff Checklist

Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion:

Team sign-off checklist

  • Accounts Framework
  • Assets
  • Confirmations
  • Core Extension UX
  • Delegation
  • Extension Platform
  • Network Enablement
  • New Networks
  • Product Safety
  • Rewards
  • Swaps and Bridge
  • Transactions
  • Wallet Integrations
  • Web3Auth

This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀

Feel free to reach out if you have questions or need clarification.

Many thanks in advance

Reference


Note

Cursor Bugbot is generating a summary for commit 5ac92b7. Configure here.

SteP-n-s and others added 30 commits October 30, 2025 21:01
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Update default slippage value for bridge quotes from 0.5 to 2%.
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37367?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: chore: update default bridge slippage to 2%

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Sets bridge default slippage to 2% via SlippageValue enum and updates
UI logic and tests accordingly.
> 
> - **Bridge logic**:
> - Replace `BRIDGE_DEFAULT_SLIPPAGE` with `SlippageValue` enum; set
`BridgeDefault = 2` and use in `ui/ducks/bridge/bridge.ts` initial
state.
> - Update slippage calculation to treat cross-chain as `2%` in
`ui/pages/bridge/utils/slippage-service.ts`.
> - **UI**:
> - Use `SlippageValue` in `bridge-transaction-settings-modal.tsx`;
hardcoded options now `[EvmStablecoin(0.5), BridgeDefault(2)]` and
default selection uses `BridgeDefault`.
> - **Tests**:
> - Update unit tests in `ui/ducks/bridge/bridge.test.ts` to expect
`SlippageValue.BridgeDefault`.
> - Adjust e2e analytics assertion in
`test/e2e/tests/metrics/bridge.spec.ts` to expect `18`
`SwapBridgeInputChanged` events.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5bf8097. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37086?quickstart=1)

Adds support for sig_params in deeplinks

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: MetaMask/MetaMask-planning#6017

## **Manual testing steps**

1. sig_params should work according to the agreed spec

## **Screenshots/Recordings**

Not applicable

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Introduce `sig_params` support in deep link canonicalization, parsing,
signing, and tests to allow selectively signed/forwarded query params.
> 
> - **Deep Links**:
> - **Canonicalization**: Enhance `canonicalize` to honor `sig_params` —
keep only listed query params (preserving repeats), append `sig_params`,
sort, and remove `sig`; fallback to previous behavior when `sig_params`
is absent.
> - **Parsing**: Use canonicalized URL, strip `sig_params` before
invoking route handlers, and verify against the original URL.
>   - **Constants**: Add `SIG_PARAMS_PARAM` (`sig_params`).
> - **Tests**:
> - **Unit**: Add cases for `sig_params` filtering, repetition
preservation, non-mutation; adjust `parse` tests to pass empty params to
handlers when only signature present.
> - **E2E**: Expand scenarios for signed-with/without `sig_params` and
unsigned; add assertions that only allowed params flow through; add
`getHashParams` helper; update redirects to ignore query in
expectations.
> - **Helpers**:
> - Update `signDeepLink` to optionally append `sig_params` (derived
from current params) and sign the full URL; add imports and sorting
adjustments.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f889979. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…37390)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

The reason for the test failure is that when calling
`clickFooterConfirmButtonAndAndWaitForWindowToClose`, the window does
not close after clicking the confirm button. This behavior is correct,
because multiple confirmation windows are open, the next test step
checks the display of the next confirmation screen. Therefore, we should
not use `clickFooterConfirmButtonAndAndWaitForWindowToClose`. The fix is
to use `clickFooterConfirmButton` instead.

Why the test was flaky instead of consistently failing? Because in the
test spec, we use `if` conditions to check and confirm the confirmation
screens. Since the send calls are triggered at the same time, the order
in which the confirmation screens appear can vary. The test verifies the
displayed information on confirmation screen regardless the screen
order.
If the flow goes into a different `if` block, the test passes; however,
if it follows this particular `if` block, the test fails.

I also improved the function `checkIsSenderAccountDisplayed` to use
`waitForSelector` to be more stable.

I ran this test 10 times and they all passed.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37390?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. test should be stable and pass

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Stabilizes multichain E2E by avoiding window-close waits during
sequential confirmations and making sender-account checks wait-based.
> 
> - **E2E Tests
(`test/e2e/flask/multichain-api/evm/wallet_invokeMethod.spec.ts`)**
> - For the second confirmation flow, replace
`clickFooterConfirmButtonAndAndWaitForWindowToClose` with
`clickFooterConfirmButton` to proceed without waiting for the window to
close when multiple dialogs are pending.
> - **Page Object
(`test/e2e/page-objects/pages/confirmations/redesign/transaction-confirmation.ts`)**
> - Make `checkIsSenderAccountDisplayed` more robust by using
`waitForSelector` with try/catch, returning a boolean after waiting for
the sender account element.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c92f5cb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ng onboarding` (#37374)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
The test fails because sometimes the 10ETH balance is not converted to
fiat. The reason is because the crypto compare request is not being
mocked. Then we see `No conversion rates`.
We sometimes see the fiat value if the network switch happens fast, and
it takes the default mock for 1337, instead of the new custom network
1338

<img width="1910" height="106" alt="image"
src="https://github.com/user-attachments/assets/e2c23373-c711-4f86-9834-36928d351532"
/>


<img width="2050" height="564" alt="image"
src="https://github.com/user-attachments/assets/a29edb70-9f6e-4a2f-a11b-3de0e2156c7c"
/>

<img width="1152" height="785" alt="image"
src="https://github.com/user-attachments/assets/6f69043d-58d5-407c-906a-93772a7d563c"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37374?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Mocks CryptoCompare pricing and updates the onboarding custom network
e2e to assert fiat balance without network switching.
> 
> - **E2E Onboarding Tests**:
> - **Mocks**: Extend `tokensMock` to also mock
`https://min-api.cryptocompare.com/data/pricemulti` for `ELY -> USD`
pricing.
>   - **Custom Network Test (`onboarding.spec.ts`)**:
> - Use `testSpecificMock: tokensMock` in fixtures to provide NFT and
price mocks.
> - Remove `switchToNetworkFromSendFlow` usage and import; directly
assert fiat balance `17,000.00` and verify add-network message.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7c024d6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Prevents jumpy UI updates when quotes are being streamed
- wait for quote request to finish loading before scrolling to alert
banners
- show loading CTA and disable submit button while quotes load so user
can view any tx warnings before submitting a trade

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37336?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: fix: defer UI actions until swap SSE quotes are fully
loaded

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-3027

## **Manual testing steps**

1. Get quotes for <$10 of any ethereum token to sol:USDC
2. Wait 30s for quotes to refresh
3. The Swap button should be disabled while quotes are loading
4. Page should only scroll to the bottom after quotes are finished
loading

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Disables submit and warning auto-scroll while quotes load, tweaks
countdown display, switches analytics to use isTxSubmittable, removes an
unused NetworkController action, and bumps bridge-controller to ^56.0.3.
> 
> - **Bridge UI**:
> - **CTA behavior**: `BridgeCTAButton` now disabled during `isLoading`;
adds tests (including parametric cases) and snapshots updated.
> - **Alerts/scrolling**: `prepare-bridge-page` avoids scrolling to
warning banners while quotes are loading.
> - **Countdown**: `useCountdownTimer` initializes with `refreshRate +
STEP` and offsets by `STEP` (snapshots show 0:31/0:06).
> - **Analytics**: `useQuoteFetchEvents` uses `useIsTxSubmittable` for
`can_submit` and keeps other quote metrics.
> - **Controllers/Messaging**:
> - Removes `NetworkController:getState` from `AllowedActions` and
delegated actions in `bridge-controller-messenger`.
> - **Dependencies**:
> - Bumps `@metamask/bridge-controller` to `^56.0.3` (lockfile updated).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a74b6de. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Bryan Fullam <bryan.fullam@consensys.net>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
- Updated font color of upload file list: color is a little dim
- Update accepted files text for claims form: removed `.` and
capitalization
- Skip only invalid files instead of blocking all files being added

https://consensyssoftware.atlassian.net/browse/SUBS-671

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37353?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: UI and functionality improvement for file uploader

## **Related issues**

Fixes:

## **Manual testing steps**

File uploader
1. Can be tested on storybook `Components/ComponentLibrary/FileUploader`
2. Set `maxFileSize` to `1048576` (1MB)
3. Upload multiple files including file with >1MB
4. Only files below 1MB will be added
5. Error message will show
6. Check file list -- font color should be text default color

Claims form
1. Login/Create an account with shield subscription
2. Go to Menu > Settings > Transaction Shield
3. Click on `Submit a claim`
4. Check file upload component
5. Copywriting should be changed (see screenshot)

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**
Copywriting of the accepted files and font color of file list will be
changed
<img width="756" height="313" alt="Screenshot 2025-10-29 at 6 43 19 PM"
src="https://github.com/user-attachments/assets/ec2838f1-3242-4614-b4d2-abd4c574cdf7"
/>


Blocks all files uploaded if one fails

https://github.com/user-attachments/assets/49a5144a-6b43-4ee8-8c1e-0ca5aed42f13


<!-- [screenshots/recordings] -->

### **After**
<img width="751" height="319" alt="Screenshot 2025-10-29 at 6 53 03 PM"
src="https://github.com/user-attachments/assets/d4e557b1-58e2-48b6-a463-236a8597d201"
/>


Blocks only invalid files

https://github.com/user-attachments/assets/3c47a901-50a4-4922-914f-d07fbb138963


<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> File uploader now adds valid files while skipping invalid ones,
updates file list styling, and the claims form/i18n now show a
parameterized max file size.
> 
> - **File Uploader
(`ui/components/component-library/file-uploader/file-uploader.tsx`)**:
> - Validation now skips only invalid/duplicate files instead of
aborting on first error; still surfaces an error message.
> - Emitted files always combine existing + newly valid files;
refactored to use helper `createFileList` path.
> - UI tweaks: default text color for filenames; removed explicit
icon/text alternative colors.
> - **Claims Form (`ui/pages/.../submit-claim-form.tsx`)**:
> - Introduces `MAX_FILE_SIZE_MB`/`MAX_FILE_SIZE_BYTES`; passes
`maxFileSize` (bytes) to `FileUploader`.
> - Updates `acceptText` to include the max size via i18n placeholder;
keeps accepted types.
> - **i18n (`app/_locales/en*/messages.json`)**:
> - `shieldClaimFileUploaderAcceptText` updated to "PDF, PNG, JPG (Max
$1MB)" with new placeholder description.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e188b3e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## Version Bump After Release

This PR bumps the main branch version from 13.8.0 to 13.9.0 after
cutting the release branch.

### Why this is needed:
- **Nightly builds**: Each nightly build needs to be one minor version
ahead of the current release candidate
- **Version conflicts**: Prevents conflicts between nightlies and
release candidates
- **Platform alignment**: Maintains version alignment between MetaMask
mobile and extension
- **Update systems**: Ensures nightlies are accepted by app stores and
browser update systems

### What changed:
- Version bumped from `13.8.0` to `13.9.0`
- Platform: `extension`
- Files updated by `set-semvar-version.sh` script

### Next steps:
This PR should be **manually reviewed and merged by the release
manager** to maintain proper version flow.

### Related:
- Release version: 13.8.0
- Release branch: release/13.8.0
- Platform: extension
- Test mode: false

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Bumps `package.json` version from 13.8.0 to 13.9.0.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e5c08fa. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->
1. References of Transaction Shield are missing in many places in Shield
screens.
2. Update them
- add links in "View full benefits" in Shield settings
- add links in Shield claims
- add links in Shield entry modal

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37380?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [x] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [x] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds `TRANSACTION_SHIELD_LINK` and updates Shield UI to open external
learn/benefits pages and navigate users to Activity for TX hash help.
> 
> - **UI/Links**:
>   - Add `TRANSACTION_SHIELD_LINK` in `ui/helpers/constants/common.ts`.
> - `ui/components/app/shield-entry-modal/shield-entry-modal.tsx`:
Replace placeholder learn-more href with `TRANSACTION_SHIELD_LINK`.
> - `ui/pages/settings/transaction-shield-tab/transaction-shield.tsx`:
View benefits opens `TRANSACTION_SHIELD_LINK` in new tab.
> - **Claims form UX**:
> -
`ui/pages/settings/transaction-shield-tab/submit-claim-form/submit-claim-form.tsx`:
> - Update "here" link to `TRANSACTION_SHIELD_LINK` (opens in new tab).
> - Change impacted TX hash help from dummy link to action: dispatch
`setDefaultHomeActiveTabName('activity')` and navigate to
`DEFAULT_ROUTE`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4cc6db5. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…37347)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

This PR fixes a race condition that prevented approval changes from
being displayed in transaction simulations.
Previously, the UI could render before the static (decoded) changes were
ready, causing missing approval data.
With this update, the component now waits for static changes to finish
decoding before rendering, ensuring approval simulations are displayed
consistently.

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37347?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Fixed issue where approval changes were sometimes
missing in transaction simulations for batch transactions.

## **Related issues**

Fixes: MetaMask/MetaMask-planning#6116

## **Manual testing steps**

1. Trigger a batch request for approve + approve + swap on Uniswap
2. Sometimes you won't see Approve within simulations

## **Screenshots/Recordings**


[save-approve-simulation.webm](https://github.com/user-attachments/assets/e28b9357-9d54-4890-9457-7738fd99a18f)


<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Defers rendering of batch simulation details and edit modal until
approve balance changes finish loading, and updates tests to mock the
new pending state.
> 
> - **Confirmations UI**:
> - `BatchSimulationDetails`: reads `pending` from
`useBatchApproveBalanceChanges` and hides `SimulationDetails` and
`EditSpendingCapModal` while approvals are loading.
> - **Tests**:
> - Add mocks for `useBatchApproveBalanceChanges` in
`base-transaction-info.test.tsx` and `info.test.tsx`.
> - Extend `batch-simulation-details.test.tsx` with a case ensuring no
UI renders when `pending: true` and adjust existing tests to supply
`pending` flag.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
109aae3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Currently the `main.yml` workflow only runs once per combination of
workflow and branch.

Usually if a new commit is pushed to a branch, the CI run on the
previous commit is no longer relevant. However that's not true on main.
Getting a full CI run for every commit on main is critical for
investigating CI failures that somehow make their way to main (e.g.
flaky test failures).

The concurrency group ID has been updated to use the SHA as the ID on
just the main branch, ensuring new commits don't cancel CI workflows for
previous commits.

Based on mobile one:
MetaMask/metamask-mobile#21893

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37395?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Update GitHub Actions concurrency group to use commit SHA on `main`,
enabling concurrent CI runs per commit on the main branch.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0ed9612. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Jest is resource hungry and because of that it is advised to fine tune
parallelization config in order to get the most of reliability and speed
of execution.

Not setting it up entirely can lead to random timeout issues, longer run
times, etc.
See the troubleshoot from Jest itself -
https://jestjs.io/docs/troubleshooting#tests-are-extremely-slow-on-docker-andor-continuous-integration-ci-server
Or the performance analysis on jest runners done by Adobe -
https://medium.com/adobetech/improve-jest-runner-performance-a8f56708ba94

This PR is just an initial setup, but we need to fine tune the config
for both local and CI execution.
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37381?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Set Jest integration tests to use maxWorkers '50%' in
`jest.integration.config.js` to limit concurrency.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
ad45ba0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
… multiple SRPs and sync them` (#37410)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

A PR which changes the text from Create Account to Add Account was
merged yesterday:
#37288

This introduces flakiness in our e2e, as we had a condition to mitigate
flakiness, which relied on Creating Account message which now has
changed.

This PR updates the copy, so we mitigate the flakiness again.

See in the logs how we waited for Creating account .. and since this
message is never there anymore, we jump into the next step causing the
spec to fail. We should wait until the account creating has completed,
by using the new copy.

<img width="1018" height="195" alt="image"
src="https://github.com/user-attachments/assets/982a32ef-79b7-4d12-8caf-6545f60f0100"
/>

<img width="1152" height="785" alt="image"
src="https://github.com/user-attachments/assets/718bac6e-5fe9-412c-b47f-b3bb475e1a3b"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37410?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Updates e2e selector to check for `Adding account...` instead of
`Creating account...` before opening the multichain account menu.
> 
> - **Tests (e2e)**
>   - In `test/e2e/page-objects/pages/account-list-page.ts`:
> - Replace `creatingAccountMessage` with `addingAccountMessage`
(`'Creating account...'` -> `'Adding account...'`).
> - Update `openMultichainAccountMenu` to assert absence of
`addingAccountMessage` before proceeding.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
2a8f851. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Fixes the icons and the auto selection logic for the gas station modal.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37352?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes: #37120

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Improve gas fee token icon rendering and refine auto-selection logic
with expanded async tests; increase e2e toast close timeout.
> 
> - **UI**:
> - `ui/pages/.../gas-fee-token-icon.tsx`: Display ERC-20 token icons
from store (`selectERC20TokensByChain` `iconUrl`) when available;
fallback to `PreferredAvatar`; keep native token rendering via
`AvatarToken`; size mapping via `AvatarAccountSize`.
> - **Logic**:
> - `useAutomaticGasFeeTokenSelect`: Only set `firstCheck` to `false`
after successfully selecting the first eligible token; supports
selection on rerender when eligibility changes (insufficient balance,
gasless support, 7702/native handling).
> - **Tests**:
> - `useAutomaticGasFeeTokenSelect.test.ts`: Convert to async with
`flushPromises`, add assertions for `forceUpdateMetamaskState`, cover
rerender/eligibility and 7702/native scenarios.
> - **E2E**:
> - `transaction-confirmation.ts`: Increase toast close
`clickElementSafe` timeout to `10000` for stability.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1b1e382. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR adds back the connection indicators to the account avatar

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36423?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Re-add connection indicator to bip44 account cell

## **Related issues**

Fixes:
https://consensyssoftware.atlassian.net/browse/MUL-1087?atlOrigin=eyJpIjoiZWZlY2YxNTE3MjA1NDIwODlkOGYwMjdlOTBhNzU0MzUiLCJwIjoiaiJ9

https://consensyssoftware.atlassian.net/browse/TMCU-161

## **Manual testing steps**

1. Open MM and DaPP
2. Connect multiple accounts
3. Go back to Account List
4. Notice the green dots on connection status.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
**Selected connected account**
<img width="399" height="596" alt="Screenshot 2025-10-28 at 10 43 33"
src="https://github.com/user-attachments/assets/8c27b62d-518f-46f1-8dc1-fe83b77e5f5e"
/>

**Selected not connected account**
<img width="401" height="596" alt="Screenshot 2025-10-28 at 10 43 44"
src="https://github.com/user-attachments/assets/bc1f0674-e8b7-4708-94aa-224ec0e35de0"
/>

**Unconnected dapp**
<img width="402" height="596" alt="Screenshot 2025-10-27 at 11 19 23"
src="https://github.com/user-attachments/assets/2e364f07-65df-4b17-af23-05b4be219c36"
/>



### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.




<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Restores and wires connection indicators on multichain account avatars
using current tab permissions, with list/page integration and
comprehensive tests/stories.
> 
> - **Multichain Accounts UI**:
> - `MultichainAccountCell`: Replaces `PreferredAvatar` with
`ConnectedStatus`; adds optional `connectionStatus` prop
(`STATUS_CONNECTED` | `STATUS_CONNECTED_TO_ANOTHER_ACCOUNT`) to control
badge; maintains selection/privacy behavior.
> - `MultichainAccountList`: Adds `showConnectionStatus` prop; derives
permitted addresses from `getAllPermittedAccountsForCurrentTab`, maps to
connected account groups via `getAccountGroupsByAddress`, and passes
computed `connectionStatus` to each `MultichainAccountCell`.
> - `AccountList` page: Enables `showConnectionStatus` when there are
permitted accounts for the active tab.
> - **Connected Status Logic**:
> - `ConnectedStatus`: Updated to support state2 via
`getIsMultichainAccountsState2Enabled` and `getAccountGroupsByAddress`;
determines connected/active vs connected-to-another and sets
badge/tooltip accordingly.
> - **Tests & Stories**:
> - Adds/updates tests for badge presence, color/state, tooltips in
`multichain-account-cell` and `multichain-account-list`; updates
snapshots; injects `activeTab` in stories/tests; minor fixture updates
(e.g., `send.test`, confirmation util).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
127bdf6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Patryk Lucka <5708018+PatrykLucka@users.noreply.github.com>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

The network request code within the client makes use of the circuit
breaker pattern. Currently, there must be 28 consecutive failed attempts
to hit an RPC endpoint before the circuit breaks and it is perceived to
be unavailable. At this point, if the endpoint is configured with a
failover, the failover will be activated and all requests will be
automatically diverted to it; otherwise requests are paused for 30
minutes.

There are two problems we are seeing now:

- If Infura is degraded enough to where failing over to QuickNode is
warranted, the failover may be activated too late.
- If the user is attempting to access a custom network and they are
experiencing issues (either due to a local connection issue or an issue
with the endpoint itself), they will be prevented from using that
network for 30 minutes. This is way too long.

To fix these problems, this commit:

- Lowers the "max consecutive failures" (the number of successive
attempts to obtain a successful response from an endpoint before
requests are paused or the failover is triggered) from 28 to 8.
- Lowers the "circuit break duration" (the period during which requests
to an unavailable endpoint will be paused) from 30 minutes to 30
*seconds*.

In summary, if a network starts to become degraded or the user is
experiencing connection issues, the network is more likely to be flagged
as unavailable, but if the situation improves the user may be able to
use the network more quickly.

How quickly does the circuit break now? It depends on whether the user
is using Chrome or Firefox and whether the errors encountered are
retriable or non-retriable:

- Retriable errors (e.g. connection errors, 502/503/504, etc.) will, as
the name implies, be automatically retried. If these errors are
continually produced, the circuit will break very quickly (if the
extension is restarted, then it will break immediately).
- Non-retriable errors (e.g. 4xx errors) do not get automatically
retried, so it takes longer for the circuit to break (if the extension
is restarted, on average it will take about 1 minute).
- Note that Chrome implements "anti-DDoS throttling logic" which means
that some non-retriable errors will turn into retriable errors. In this
situation the circuit breaks faster than it would on Firefox.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37002?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Decrease time before activating QuickNode when Infura
is degraded or unavailable; decrease time before allowing users to
interact with a custom network following connection issues

## **Related issues**

- https://consensyssoftware.atlassian.net/browse/WPC-103

## **Manual testing steps**

### Prerequisites

1. Install
[FoxyProxy](https://chromewebstore.google.com/detail/foxyproxy/gcknhkkoolaabfmlnjonogaaifnjlfnp).
Pin it.
2. Open the options for FoxyProxy (click on its icon and go to Options).
3. Click on the Proxies tab, then click on Add. A new box should appear.
4. Under "Hostname", enter `localhost`; under "Port", enter `8080`;
enter some name in "Title".
5. Next to "Proxy by Patterns", click the plus icon. You should see a
new row appear.
6. In the `://example.com` field, enter `https://*.infura.io/*`; in the
"title" field, enter some name, like "Localhost". (This will ensure that
only requests to Infura go through the proxy.)
8. Install
[`mitmproxy`](https://docs.mitmproxy.org/stable/overview/installation/).
10. Create a Python script somewhere on your computer with the following
contents:
https://gist.github.com/mcmire/1d43ce690d3a974217126cd584f79b7d. This
script will cause all requests to Infura RPC endpoints to respond with
500, simulating an outage.
11. Run `mitmproxy -s <path to your script>` in an open terminal
session. This will run the proxy server.
12. Go back to FoxyProxy and enable the proxy you created earlier by
clicking on the icon, then choosing the name of the new proxy (e.g.
Localhost).
13. Check out this branch. Run `yarn`, then `yarn start`.
14. Ensure that you've added the local version of MetaMask to your
browser and no other versions are present.
15. Open MetaMask, and go through onboarding.
16. Open the DevTools for the extension (Chrome: go to Extensions, find
MetaMask, click on "service worker"; in Firefox, go to
`about:debugging`, find MetaMask, click on "Inspect").

### Testing non-retriable errors

1. Ensure that in the `mitmproxy` script, all Infura endpoints return
500.
2. Restart the extension.
3. Switch to DevTools. You should see request errors like "RPC endpoint
not found or unavailable" in the Console view.
5. Open MetaMask and switch to full-screen view so that it stays open.
6. Switch back to DevTools and wait. After about 20 seconds, you should
see errors that say "RPC endpoint returned too many errors".

### Testing retriable errors

1. Stop `mitmproxy`. Modify the script so that all Infura endpoints
return 503 instead of 500. Restart it.
2. Restart the extension.
3. Switch to DevTools. You should see a flurry of messages, and at the
end you should see an error that says "RPC endpoint returned too many
errors".

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

#### Chrome

In this video, the endpoint continually responds with 500 (a
non-retriable error):


https://github.com/user-attachments/assets/fc8956d2-ec43-4ba6-a4c0-8e68b72b90c4

In this video, the endpoint continually responds with 503 (a retriable
error):


https://github.com/user-attachments/assets/d449e404-d755-4d81-be94-0bee44174354

#### Firefox

In this video, the endpoint continually responds with 500 (a
non-retriable error):


https://github.com/user-attachments/assets/6500f3a2-b0e8-459f-86f6-20f15044ecda

In this video, the endpoint continually responds with 503 (a retriable
error):


https://github.com/user-attachments/assets/84361615-e6a9-48a0-aab4-13ca016eec2e

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Tightens RPC circuit-breaker settings by using DEFAULT_MAX_RETRIES,
setting a 30s cooldown, and reducing maxConsecutiveFailures for
QuickNode and other endpoints.
> 
> - **Network Controller Init
(`app/scripts/controller-init/network-controller-init.ts`)**
>   - Use `DEFAULT_MAX_RETRIES` for RPC retries.
> - Introduce shared `policyOptions` with `circuitBreakDuration: 30 *
SECOND`.
>   - Adjust `maxConsecutiveFailures`:
>     - QuickNode endpoints: `(maxRetries + 1) * 10`.
>     - Other endpoints: `(maxRetries + 1) * 3`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
bb71a1c. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Fix token name truncation

Long term, we need to handle this in a list item type of component

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37429?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: fix: token name truncation

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**
<img width="625" height="94" alt="BEFORE truncate fix"
src="https://github.com/user-attachments/assets/815f0755-0fdc-4f91-ab0b-d38f8ddca9da"
/>

<!-- [screenshots/recordings] -->

### **After**
<img width="619" height="100" alt="AFTER truncate fix"
src="https://github.com/user-attachments/assets/681cd8bb-fb81-4477-b80a-ead8dc9f2597"
/>

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds `min-w-0` to token title wrappers to allow proper name ellipsis;
updates affected snapshots.
> 
> - **Frontend**
> - `ui/components/app/assets/token-cell/cells/token-cell-title.tsx`:
Add `className="min-w-0"` to the outer and inner `Box` wrappers around
`AssetCellTitle`/`Tag` to enable token name truncation.
> - **Tests**
>   - Update snapshots reflecting layout changes in:
> -
`ui/components/app/assets/token-cell/__snapshots__/token-cell.test.tsx.snap`
> - `ui/pages/asset/components/__snapshots__/asset-page.test.tsx.snap`
> -
`ui/pages/defi/components/__snapshots__/defi-details-list.test.tsx.snap`
> -
`ui/pages/defi/components/__snapshots__/defi-details-page.test.tsx.snap`
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
db41a4d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Cleanup the useless fallbacks in spread

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37370?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Removes unnecessary `?? {}` fallbacks in object spread operations
across controllers, tests, and UI code.
> 
> - **Controllers**
> - `app/scripts/controllers/onboarding.ts`: Replace `{ ...(this.state
?? {}) }` with `{ ...this.state }` in `registerOnboarding`.
> - `app/scripts/controllers/preferences-controller.ts`: Initialize
reducer accumulator with `{ ...lostIdentities }` instead of `{
...(lostIdentities ?? {}) }`.
> - **Tests**
> - Update mock setup to spread `mockRequests` directly (remove `?? {}`)
in multiple files under `test/integration`, including transaction
confirmations, NFTs, DeFi, notifications, and swaps.
> - **UI**
> -
`ui/components/app/modals/new-account-modal/new-account-modal.container.js`:
Spread `state.appState.modal.modalState.props` directly.
> - `ui/components/multichain/app-header/app-header.test.js`: Spread
`stateChanges` directly during store setup.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7ec8907. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
### Handle backend error codes on UI

```
export type SubmitClaimErrorResponse = {
  message: string;
  errorCode: SubmitClaimErrorCode;
  statusCode: number;
  errorsDetails?: {
    field: SubmitClaimField;
    error: string;
    errorCode: SubmitClaimErrorCode;
  }[];
};
```

**General Errors**
- Errors which are not tied to specific form field.
- This errors are show using a toast.

**Field specific errors**
- This errors are found on `errorsDetails` inside error object from
claims post api response. It is shown to specific form field using the
`field` key
- Some errors outside the `errorDetails` maybe shown to a specific field
also and is handled through `ERROR_MESSAGE_MAP` which may contain a
`field` key also, if there is no `field` key on the item then we show it
in a toast

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37391?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Handle claims submit backend errors

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**
**Generic error**: no internet, backend is down
<video
src='https://github.com/user-attachments/assets/5782b670-1d70-4dd4-9a3f-435c837a10b1'
/>


**Field validation error**: _removed FE validation to demo_
<video
src='https://github.com/user-attachments/assets/98a55ae8-a779-4da1-ba32-8efbea5ae859'
/>


**Non field validation error but tied to a form field**
<video
src='https://github.com/user-attachments/assets/b032c476-daac-4b26-b27d-93d725d1a420'
/>


**General error shown on toast**
<video
src='https://github.com/user-attachments/assets/b22a9e3c-c16f-4ca5-9148-88c70a8643f2'
/>


<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Implements structured backend error handling for the claim form with
field-level mapping, loading state, and updated i18n (including
parameterized submission window).
> 
> - **UI/Forms**:
> - Refactor `submit-claim-form.tsx` to use typed fields and centralized
error handling via `ERROR_MESSAGE_MAP` and
`SUBMIT_CLAIM_FIELD_ERROR_MESSAGE_MAP`.
> - Add `VALID_SUBMISSION_WINDOW_DAYS` and render it in
`shieldClaimDetails` text.
> - Introduce `handleSubmitClaimError` to route backend errors to field
errors or toast; disable submit during loading and show `LoadingScreen`.
> - Fix error keying for `impactedTxHash` and add same-wallet-address
validation.
> - **Errors/Types**:
>   - Add `SubmitClaimError` class (`claim-error.ts`).
> - Add `SUBMIT_CLAIM_FIELDS`, `SUBMIT_CLAIM_ERROR_CODES`, and
`SubmitClaimErrorResponse` in `types.ts`.
> - **Actions/Networking**:
> - Update `submitClaim` action to parse backend JSON, throw
`SubmitClaimError` with `errorCode`, and handle generic failures.
> - **i18n**:
> - Update `en`/`en_GB` locales: parameterize `shieldClaimDetails`
days/link; add messages for duplicate claim, file errors, max claims
limit, same wallet address, submission window expired; tweak ineligible
TX text.
>   - Remove outdated `shieldClaimDetails` entry from `ga` locale.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e60dbf1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

- Reduces by 2 the number of reusable workflows called by workflow
`main` ([there's a limit of
20](https://docs.github.com/en/actions/reference/workflows-and-actions/reusing-workflow-configurations#limitations-of-reusable-workflows))
- This also has the effect of making everything run faster, due to fewer
jobs and fewer `action-checkout-and-setup` steps
- Folds the `Page Load Benchmark Results` PR comment into the other
metamaskbot comment for less disruption

## **Changelog**

CHANGELOG entry: null

<!--## **Related issues**
## **Manual testing steps**
## **Screenshots/Recordings**
## **Pre-merge author checklist**
## **Pre-merge reviewer checklist**-->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Consolidates page-load benchmark into a single workflow with new
artifact/filename, uploads historical data on main, and folds PR comment
generation into the build announce with historical comparisons.
> 
> - **CI/Workflows**:
> - Replace `page-load-benchmark-pr` and remove
`page-load-benchmark-upload`; use unified `page-load-benchmark` workflow
with numeric inputs and required secret.
> - Run benchmarks on PRs and main; upload artifact
`page-load-benchmark-results` and, on `main`, commit stats to
`extension_benchmark_stats`.
> - Update `main.yml` to call
`./.github/workflows/page-load-benchmark.yml` and gate publish on
`page-load-benchmark`.
> - In `publish-prerelease.yml`, download `page-load-benchmark-results`
directly instead of using the deleted action.
> - **Scripts**:
> - Update `.github/scripts/benchmark-stats-commit.sh` to use
`HEAD_COMMIT_HASH`, `OWNER`, and new results path
`test-artifacts/benchmarks/page-load-benchmark-results.json`.
> - **Bot Comment Integration**:
> - Refactor `development/page-load-benchmark-pr-comment.ts` to export
`getPageLoadBenchmarkComment` (no direct posting), wrap output in a
collapsible section, and compare against recent `main` data with
regression warnings.
> - Integrate page-load benchmark comment into
`development/metamaskbot-build-announce.ts` so a single MetaMask bot
comment includes builds, benchmarks, and size diffs.
> - **Artifacts/Paths**:
> - Rename benchmark output file and artifact from
`benchmark-results.json` → `page-load-benchmark-results.json` and update
all references.
> - **Tests/Docs**:
>   - Update Playwright spec and README to use the new results filename.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
424ed39. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Norbert Elter <72046715+itsyoboieltr@users.noreply.github.com>
## **Description**

This PR makes several small optimizations and bug fixes to the way we
capture metrics and display URLs for our phishing page.

- **Improves consistency:** Metrics always uses `hostname` now.
Previously, blockedUrl being set to `details.initiator` would add a
`https://` prefix to our metrics (when it was a c2) whereas only
`hostname` would be tracked otherwise
- **Bug fix:** for c2 domain blocks, we previously would display the c2
itself on the phishing page and as the 'Proceed anyway' link. This PR
changes it to use the actual domain that the request came from, in order
to improve clarity for the user.
- **Bug fix:** Fixes:
MetaMask/MetaMask-planning#6038

## Changelog
CHANGELOG entry: fix: use correct href for phishing page proceed anyway
button

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36871?quickstart=1)


## **Screenshots/Recordings**

### **Before**

**Website blocked by c2:**

<img width="807" height="746" alt="image"
src="https://github.com/user-attachments/assets/1bc48956-c978-4adf-b499-8c29fb2060ea"
/>


### **After**

**Website blocked by c2:**

<img width="1159" height="796" alt="image"
src="https://github.com/user-attachments/assets/d53f9c9d-01b2-4015-99dd-8ed1b87cb3dd"
/>

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [x] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [x] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Fixes phishing warning redirect params by using full href, deriving
hostname safely, and handling c2-initiated requests.
> 
> - **Phishing detection (app/scripts/background.js)**:
>   - Initialize `blockedUrl` from `href` instead of `hostname`.
> - For c2-detected blocks, set `blockedUrl` to `details.initiator`;
derive `blockedHostname` via `new URL(blockedUrl).hostname` with
fallback to original `hostname`/`href` on parse failure.
> - Build phishing warning redirect hash with `hostname:
blockedHostname` and `href: blockedUrl` to drive page display and
"proceed anyway" link.
>   - Minor: add clarifying comments; no API surface changes.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6eebe10. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR concludes the migration to `AccountsTrackerController` from
core. This is necessary in order to benefit from performance changes
added and planned to the core controller.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36808?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-1368

## **Manual testing steps**

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [X] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [X] I've completed the PR template to the best of my ability
- [X] I’ve included tests if applicable
- [X] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [X] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.




<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Replaces the local AccountTrackerController with the core one, removes
legacy tracker/polling and gas-limit state, and updates state shape,
selectors, metrics, tests, and dependencies accordingly.
> 
> - **Core/Controllers**:
> - Replace local `AccountTrackerController` with
`@metamask/assets-controllers` version; update init, messengers, allowed
actions/events, and wiring.
> - Remove legacy files (`account-tracker-controller*`, `batch-utils*`,
`constants/contracts.ts`, types) and related listeners/APIs (e.g.,
balance-update on tx, account syncing).
> - Drop `accounts` and `currentBlockGasLimit*` from background/UI
state; rely on `accountsByChainId` only; update sentry state and types.
> - Remove account-tracker polling APIs/hook; stop exposing start/stop
polling from background.
> - Bump `@metamask/assets-controllers` to `^86.0.0`; update LavaMoat
policies.
> - Preferences: add `isMultiAccountBalancesEnabled` mirroring
`useMultiAccountBalanceChecker`.
> - **MetaMaskController**:
> - Remove tracker syncing/clearing and tx-balance update; use
checksummed addresses in `getBalance` and metrics.
> - **Transactions/Init**:
>   - Simplify listeners; stop updating balances on tx events.
> - **UI/Selectors & Send Flow**:
> - Normalize `accountsByChainId` address handling (lowercasing in
selectors); remove `getBlockGasLimit` usage; adjust gas estimate logic.
> - Fix `token-search` null guard; update tests/fixtures to checksummed
addresses.
> - **Metrics/Telemetry**:
> - Compute `number_of_accounts` from `accountsByChainId`; update
masked/removed fields.
> - **Tests/Fixtures**:
> - Update mocks to checksummed addresses; remove obsolete
expectations/delays; align with new state shape.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3cfb04e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

It seems ci conditions got worse in the last week, surfacing more
flakiness in different points.
This spec fails because it waits for events with a given delay but it's
not enough now. Increasing the delay fixes the issue.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37450?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Replaces `largeDelayMs` with a fixed 5000ms wait in Sentry/Segment
tests to reduce flakiness.
> 
> - **Tests (e2e)**:
>   - In `test/e2e/flask/snaps/preinstalled-example.spec.ts`:
> - Replace `largeDelayMs` with `5000` for `driver.wait` when awaiting
mocked endpoints in:
>       - `snap_trackError` (Sentry error)
>       - `snap_trackEvent` (Segment event)
>       - `snap_startTrace`/`snap_endTrace` (Sentry trace)
>     - Simplify helpers import (remove unused `largeDelayMs`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5bbc0b9. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ock and login successfully` (#37451)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

This issue should be fixed on the wallet side but until that's not done,
we mitigate the error on the test side by ignoring the error.

#37459

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37451?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> E2E unlock wallet test now ignores the console error 'unable to
proceed, wallet is locked' to reduce flakiness.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4eadccf. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

The timeout in clickElementAndWaitToDisappear has a default max value of
2seconds. This is insufficient in the update modal test, where sometimes
the spec fails as the element didn't disappear yet:

<img width="951" height="146" alt="image"
src="https://github.com/user-attachments/assets/47433113-1793-4c83-ad0e-316bfabeedf0"
/>

This increases the default timeout to 3 seconds at the driver method
level. This won't mean that we will always wait until the full 3 seconds
but that now, we have a bigger window to wait.
I chose to change this at the driver method, to help stabilize all ci in
general, not just for that case, as 3 seconds still seams a reasonable
amount of time (in the case we need to fully wait for them).


<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37465?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci. I edited the spec file to trigger the quality gate and run
the Update Modal spec 5 more times x4 (each build), so it was run 20+4
times and it passed (other specs failed due to existing flakiness, being
fixed in different PRs)


0b857c0


## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.



<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Increase default timeout from 2s to 3s in
`clickElementAndWaitToDisappear` to improve reliability of disappearing
elements.
> 
> - **Tests (E2E)**:
>   - `test/e2e/webdriver/driver.js`:
> - `clickElementAndWaitToDisappear`: default timeout increased `2000ms`
→ `3000ms`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
919feab. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ing accounts during a NFT send` (#37460)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
This test is flaky as we are trying to assert an element has the correct
text. This can lead to a race condition when we do the assert, and the
element hasn't yet being updated:

<img width="1004" height="318" alt="image"
src="https://github.com/user-attachments/assets/ff98d6ae-16c3-4630-a834-edaf184a2c7c"
/>

And you see in the screenshot the asset is correct:

<img width="1050" height="812" alt="image"
src="https://github.com/user-attachments/assets/ab1875dd-6f09-4eda-838b-616b9a6c4954"
/>

<img width="1050" height="812" alt="image"
src="https://github.com/user-attachments/assets/46bce31a-c474-47db-b567-45564584df1a"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37460?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Stabilizes e2e token symbol verification by waiting for the selector
with matching text in the send token asset picker.
> 
> - **Tests (e2e)**:
> - **Send token page object
(`test/e2e/page-objects/pages/send/send-token-page.ts`)**:
> - Update `checkTokenSymbolInAssetPicker` to use `waitForSelector({
css: asset symbol, text })` instead of reading text and asserting
directly, improving synchronization when verifying the token symbol.
> - Retain optional token ID check via `waitForSelector` on `p` with
`#<id>` text.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
12dee59. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…works when adding a network via dapp` (#37456)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
The spec fails because there's a console error with an RPC error. The
problem is that we are adding Avalanche network, and we start and Anvil
server with that chainId, however, the Avalanche requests are not
redirected to our local server, causing that when the RPC call is made,
that is redirected to the catch all mock, returning an empty response
body and triggering the console error, if the test is slow, and there's
enough time for that to happen.

This PR blocklist the Avalanche Infura calls, so those are redirected to
our anvil local server

<img width="1001" height="574" alt="image"
src="https://github.com/user-attachments/assets/2ea3e508-c9bb-4441-91ab-e4028ea86951"
/>

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37456?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Check ci

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Add `avalanche-mainnet.infura.io` to `blocklistedHosts` in
`test/e2e/mock-e2e.js` so RPC requests are redirected to
`localhost:8545`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7d99aa8. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#37452)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR aims to activate re-simulation feature when user focus the
active extension window for `batch` transactions.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37452?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: Batch transaction resimulation 

## **Manual testing steps**

1. Batch transaction simulation network requests (sentinel) should be
visible in the network tab when focused in the active window.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [X] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [X] I've completed the PR template to the best of my ability
- [X] I’ve included tests if applicable
- [X] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [X] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds `TransactionType.batch` to `FOCUSABLE_TYPES` to enable batch tx
re-simulation on window focus.
> 
> - **Confirmations UI**
> - Update `ui/pages/confirmations/hooks/useTransactionFocusEffect.ts`:
> - Add `TransactionType.batch` to `FOCUSABLE_TYPES` so batch
transactions toggle active state on window focus.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6d7c6da. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

No need for a nested `if` without `else`

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37433?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Consolidates nested conditionals and adds minimal guard checks across
background, controllers, services, streams, tests, UI, and selectors
without altering behavior.
> 
> - **Background**
> - Simplify phishing test bypass check in `app/scripts/background.js`
by merging nested conditions.
> - **Controllers**
> - Streamline `addPollingToken` in
`app/scripts/controllers/app-state-controller.ts` (combine checks and
call updater directly).
> - **Services**
> - Tighten success URL match with optional chaining and simplify
listener logic in
`app/scripts/services/subscription/subscription-service.ts`.
> - **Streams**
> - Collapse legacy notification method remap conditional in
`app/scripts/streams/provider-stream.ts`.
> - **Tests**
> - Flatten error-handling call generation logic in
`test/e2e/api-specs/MultichainAuthorizationConfirmationErrors.ts`.
> - **UI**
> - Add `onNetworkChange` guard and merge conditions on multiselect
submit in `ui/components/.../asset-picker.tsx`.
> - **Selectors**
> - Simplify connected-account selection logic in
`ui/selectors/selectors.js` (ensure selected address not already
connected).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
fdc88d2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Introduces a new optional alert property to hide navigation for this
alert.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37425?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->



https://github.com/user-attachments/assets/249abb46-f295-4035-b838-5e1843658410



## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds `hideFromAlertNavigation` to alerts and updates hooks/modal to
skip these in navigation, with tests and usage updates.
> 
> - **Alert Model**:
>   - Add optional `hideFromAlertNavigation` to `Alert`.
> - **Hooks (`useAlerts`)**:
> - Return `navigableAlerts`, `navigableFieldAlerts`,
`navigableGeneralAlerts`, and `getNavigableFieldAlerts`, excluding
alerts with `hideFromAlertNavigation`.
>   - Ensure severity sorting is non-mutating.
> - **UI – MultipleAlertModal**:
>   - Drive selection by `alertKey` with robust syncing/fallback logic.
> - Navigate only through `navigable*` alerts; hide nav controls if
current alert sets `hideFromAlertNavigation` or when skipping is
requested.
>   - Acknowledge just triggers `onFinalAcknowledgeClick` (no cycling).
> - **UI – ConfirmInfoAlertRow**:
> - Derive `selectedAlert` once; pass `skipAlertNavigation` based on
`hideFromAlertNavigation`.
> - **Alerts – Shield Coverage**:
>   - Mark shield coverage alert with `hideFromAlertNavigation: true`.
> - **Tests**:
> - Update/extend tests for severity ordering, navigable alert
filtering, modal navigation hiding/skipping, and selection behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
22c7214. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37439?quickstart=1)

Remove selectors from spec page and replace them with page specific
checks.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Replace selector-based confirmation with Activity List page-object
checks in snap account transfer e2e tests.
> 
> - **Tests (e2e)**:
>   - Update `test/e2e/tests/account/snap-account-transfers.spec.ts`:
> - Replace selector-based confirmation
(`.transaction-status-label--confirmed`) with Activity List verification
via `ActivityListPage.checkConfirmedTxNumberDisplayedInActivity(1)` in
both sync and async approve flows.
> - Instantiate `ActivityListPage` to perform confirmation checks after
sending transactions.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
092cd07. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
- fix: cp-13.9.0 bump bitcoin (#37756)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Updates bitcoin to `1.5.0`, which places accounts info under encrypted
state

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub

Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37756?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding

Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling

guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Upgrade @metamask/bitcoin-wallet-snap from 1.4.5 to 1.5.0 with
corresponding yarn.lock and attribution updates.
> 
> - **Dependencies**:
> - Upgrade `@metamask/bitcoin-wallet-snap` to `^1.5.0` in
`package.json`.
> - Update `yarn.lock` to resolve `@metamask/bitcoin-wallet-snap@1.5.0`.
>   - Refresh `attribution.txt` to reflect version `1.5.0`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8c006ec. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[de21015](de21015)

---------

Co-authored-by: Alejandro Garcia Anglada <aganglada@gmail.com>
Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
@metamaskbot
Copy link
Collaborator Author

Builds ready [4a75df2]
UI Startup Metrics (1227 ± 94 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1227107715009412981404
load105893212848611291204
domContentLoaded105292812788411231196
domInteractive221497142063
firstPaint65894129642410771198
backgroundConnect2292152567233240
firstReactRender25184352739
getState23892122741
initialActions001001
loadScripts829686102783902974
setupStore1172541120
numNetworkReqs1367619671
BrowserifyPower User HomeuiStartup19001628246625020602466
load1035920141915911701419
domContentLoaded1028912140315711591403
domInteractive291681204781
firstPaint64315814164149621416
backgroundConnect2342232476237247
firstReactRender29254962849
getState17116020311180203
initialActions001011
loadScripts80169011741579261174
setupStore12102941229
numNetworkReqs1186524167209241
WebpackStandard HomeuiStartup8447081224948501069
load61756698283611861
domContentLoaded61056196680603834
domInteractive16126391537
firstPaint20860969202205704
backgroundConnect241176142359
firstReactRender29185983538
getState1153241318
initialActions001001
loadScripts60755995678601824
setupStore1162531316
numNetworkReqs1467520872
WebpackPower User HomeuiStartup13231165169916714431699
load679583954120800954
domContentLoaded657572896101747896
domInteractive251356175356
firstPaint30177900256575900
backgroundConnect55101704882170
firstReactRender28263112931
getState1479318825159188
initialActions001001
loadScripts65257088598737885
setupStore1162761327
numNetworkReqs1246634375170343
FirefoxBrowserifyStandard HomeuiStartup14991293203114415561802
load12641112173210013121452
domContentLoaded12631112173210013121452
domInteractive1043729043110203
firstPaint------
backgroundConnect4325104165083
firstReactRender27225752836
getState10417919829
initialActions002001
loadScripts1238109617009812851409
setupStore156123141433
numNetworkReqs1266415756
BrowserifyPower User HomeuiStartup24152114283922425822839
load13861149180019816101800
domContentLoaded13851149180019816091800
domInteractive19876559175472559
firstPaint------
backgroundConnect1153328586209285
firstReactRender42315274952
getState1258119129157191
initialActions107217
loadScripts13441131177220115851772
setupStore2861243050124
numNetworkReqs1357123563215235
WebpackStandard HomeuiStartup15791403211714516091914
load13471192166010313841576
domContentLoaded13471192165910313841576
domInteractive943035738105158
firstPaint------
backgroundConnect50191292453118
firstReactRender3022132142968
getState10417422715
initialActions001001
loadScripts1314117415899513541525
setupStore167130201272
numNetworkReqs1367618766
WebpackPower User HomeuiStartup25722233379539028493795
load15591288233626817192336
domContentLoaded15581287233526817182335
domInteractive22139945244399945
firstPaint------
backgroundConnect76352164997216
firstReactRender45316085160
getState1297519233168192
initialActions101011
loadScripts15281266229726516912297
setupStore4261294064129
numNetworkReqs1556532991216329

…in individual asset activity (#37773)

- fix: cp-13.9.0 BTC redeposits not shown in individual asset activity
(#37732)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
BTC redeposits not shown in individual asset activity section

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub

Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37732?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: fix BTC redeposits not shown in individual asset
activity

## **Related issues**

Fixes:
https://consensys.slack.com/archives/C09KHA0P1B7/p1762876275492479 &
https://consensyssoftware.atlassian.net/browse/ASSETS-1765

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<img width="796" height="1182" alt="image"

src="https://github.com/user-attachments/assets/30905fe2-fa76-43bd-bcfc-a94ac9b2e6dd"
/>

<!-- [screenshots/recordings] -->

### **After**

<img width="669" height="1042" alt="image"

src="https://github.com/user-attachments/assets/abc0e25b-e285-49aa-aab6-25d6725c1994"
/>

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding

Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling

guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Ensures Bitcoin redeposit transactions appear in individual asset
activity by adjusting non‑EVM token filtering.
> 
> - **Non‑EVM activity filtering**
(`ui/components/app/transaction-list/unified-transaction-list.component.js`):
> - Update `filterNonEvmTxByToken` to detect Bitcoin networks
(`tokenAddress` starts with `bip122`).
> - Include redeposit transactions (empty `to` array and
`KeyringTransactionType.Send`) when filtering by token, bypassing strict
asset match.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c2c7d86. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[da713dc](da713dc)

Co-authored-by: Juanmi <95381763+juanmigdr@users.noreply.github.com>
@metamaskbot
Copy link
Collaborator Author

Builds ready [9ae1878]
UI Startup Metrics (1243 ± 90 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1243109615279013111389
load107093013048211371204
domContentLoaded106392712858111301198
domInteractive221582132059
firstPaint660137132642110651173
backgroundConnect2322172909236247
firstReactRender27175172845
getState2395192741
initialActions003001
loadScripts837713105781906973
setupStore1172331217
numNetworkReqs1367719671
BrowserifyPower User HomeuiStartup19381709287731622652877
load1030899152319812901523
domContentLoaded1022893151219712811512
domInteractive301573205773
firstPaint512177966328915966
backgroundConnect23522427613237276
firstReactRender28254342843
getState17315123121182231
initialActions001011
loadScripts797671124619010631246
setupStore15954111254
numNetworkReqs1207525473240254
WebpackStandard HomeuiStartup85471112601078601146
load622563101095610923
domContentLoaded61555898191604907
domInteractive161166101443
firstPaint222641010218210761
backgroundConnect251275142461
firstReactRender301868103545
getState1163241316
initialActions001001
loadScripts61255697089602897
setupStore1162541318
numNetworkReqs1367520873
WebpackPower User HomeuiStartup13321151195523815341955
load68958410561588461056
domContentLoaded67057010221478081022
domInteractive271386234686
firstPaint4317210583135871058
backgroundConnect49131735651173
firstReactRender28243023030
getState14210315921155159
initialActions101111
loadScripts66656810111447981011
setupStore1462892628
numNetworkReqs1227022257164222
FirefoxBrowserifyStandard HomeuiStartup15101333189110715591718
load1286114115138413451451
domContentLoaded1286114115128413441451
domInteractive1143432951118241
firstPaint------
backgroundConnect4425122175277
firstReactRender27227372742
getState849410721
initialActions001001
loadScripts1258112014908113151394
setupStore1376391332
numNetworkReqs1266616761
BrowserifyPower User HomeuiStartup24682162388745526733887
load13731148191421415841914
domContentLoaded13731148191421415841914
domInteractive22182622201455622
firstPaint------
backgroundConnect11829483141205483
firstReactRender463088175188
getState1218216827154168
initialActions001011
loadScripts13381131178419315281784
setupStore2951353749135
numNetworkReqs1376932690229326
WebpackStandard HomeuiStartup17731549251919018072261
load14891264186012815571782
domContentLoaded14891263185912815561782
domInteractive1043237145108182
firstPaint------
backgroundConnect62281783367146
firstReactRender34258793546
getState1049412825
initialActions001011
loadScripts14501245181611715221691
setupStore206226241747
numNetworkReqs1366617764
WebpackPower User HomeuiStartup25242167358938727583589
load15231243194721417661947
domContentLoaded15221242194621417651946
domInteractive14946402118264402
firstPaint------
backgroundConnect98333008296300
firstReactRender423074114774
getState1086218025115180
initialActions001011
loadScripts14881222189320817151893
setupStore3061463753146
numNetworkReqs1335732685205326

…p-13.9.0 (#37785)

- fix: force account alignment on unlock cp-13.9.0 (#37762)

## **Description**

Force account alignment on unlock to cover new account providers being
added.

> [!NOTE]
> Normally, we should run discovery + alignment asynchronously for a
better UX, but this involves a lot more work. For now, this will cover
new account providers being added to the extension.

[![Open in GitHub

Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37762?quickstart=1)

## **Changelog**

CHANGELOG entry: Automatically create new account types on wallet unlock

## **Related issues**

N/A

## **Manual testing steps**

- Go to branch `v13.7.0`
  * Build the extension with: `yarn build --build-type main dist`
- Go to this branch
  * Build the extension with: `yarn build --build-type main dist`
- Make a folder `_local` and `cd` into it
- Run `cp ../builds/metamask-chrome-13.7.0.zip . && unzip *.zip`
- Load and start the extension
- Create a new SRP
- Import another SRP
- Create some accounts on both SRP
- Stop the extension
- Run `cp ../builds/metamask-chrome-13.10.0.zip . && unzip *.zip` (build
for this branch)
- Reload the extension
- You should see some `Running ... migration` message
- Check all your multichain accounts, you should now see Bitcoin
accounts for all of them.

## **Screenshots/Recordings**

### **Before**

### **After**



https://github.com/user-attachments/assets/29ab83b2-520a-4331-8e8f-0f5b92490b69



https://github.com/user-attachments/assets/788b3518-9826-45a8-a3d5-62cd239e733f

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding

Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling

guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> On unlock, asynchronously align multichain wallets when state 2 is
enabled; add remote feature-flag access to skip snap account renaming
under state 2 and update tests/messenger types.
> 
> - **Controller (`app/scripts/metamask-controller.js`)**
> - On unlock, when multichain accounts feature state 2 is enabled,
asynchronously call `multichainAccountService.alignWallets()`.
> - **Snap Keyring (`app/scripts/lib/snap-keyring`)**
> - Add feature-flag check (`RemoteFeatureFlagController:getState`) to
detect multichain accounts state 2.
> - When state 2 is enabled, skip `AccountsController:setAccountName`
during account creation to avoid races; retain legacy path otherwise.
> - **Messaging/Types**
> - Allow `RemoteFeatureFlagController:getState` in `SnapKeyringBuilder`
messenger and include corresponding action in types.
> - **Tests**
> - Update `snap-keyring.test.ts` to mock
`RemoteFeatureFlagController:getState` and reflect new behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b6342a9. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[ce622e6](ce622e6)

Co-authored-by: Charly Chevalier <charly.chevalier@consensys.net>
@metamaskbot
Copy link
Collaborator Author

Builds ready [ea0eac7]
UI Startup Metrics (1220 ± 91 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1220108214799112831390
load104792212767911021191
domContentLoaded104191212677810961181
domInteractive221492151856
firstPaint585150131040910411151
backgroundConnect2312192729234250
firstReactRender25186472740
getState21870102342
initialActions001001
loadScripts816671104378870956
setupStore1062531117
numNetworkReqs1367419671
BrowserifyPower User HomeuiStartup22231973320128622903201
load1122926169020112591690
domContentLoaded1104918167119712461671
domInteractive351784194084
firstPaint705178140642710991406
backgroundConnect25323134226262342
firstReactRender34274653746
getState20214528739229287
initialActions001011
loadScripts87169613641819901364
setupStore2093892238
numNetworkReqs1258223856199238
WebpackStandard HomeuiStartup84571513221088491160
load618564111098608936
domContentLoaded611558109195601920
domInteractive16124891443
firstPaint200601094215193923
backgroundConnect241180132653
firstReactRender3018128133450
getState1152231217
initialActions001001
loadScripts608555108193599910
setupStore1253251327
numNetworkReqs1367419870
WebpackPower User HomeuiStartup13161177182621813551826
load669585980122768980
domContentLoaded649573920108725920
domInteractive291380256180
firstPaint31677952276586952
backgroundConnect48131885586188
firstReactRender28253112931
getState1407319031156190
initialActions001001
loadScripts645571909104715909
setupStore1562892528
numNetworkReqs1107122455168224
FirefoxBrowserifyStandard HomeuiStartup15011324202014215581846
load12681131165410613331447
domContentLoaded12671130165410613321447
domInteractive1123539061120244
firstPaint------
backgroundConnect47261422451116
firstReactRender27214652740
getState849711721
initialActions001001
loadScripts12401110163110413111418
setupStore177241251448
numNetworkReqs1266715756
BrowserifyPower User HomeuiStartup34732559513071241275130
load15861315225428518812254
domContentLoaded15861315225328518812253
domInteractive325163724170477724
firstPaint------
backgroundConnect50372124844410081248
firstReactRender593787147187
getState15010122430164224
initialActions101011
loadScripts15441235222529118492225
setupStore13633797174132797
numNetworkReqs1437522459221224
WebpackStandard HomeuiStartup16271459233814116531935
load1377125416238814261580
domContentLoaded1376125416238814251580
domInteractive933127334107159
firstPaint------
backgroundConnect51253483954119
firstReactRender312479103158
getState84487824
initialActions001001
loadScripts1347122315958013961496
setupStore17797171678
numNetworkReqs1366918767
WebpackPower User HomeuiStartup32632574450958139424509
load16671459210519018682105
domContentLoaded16661459210419018672104
domInteractive24710939079345390
firstPaint------
backgroundConnect42676866306782866
firstReactRender523188165788
getState17496773156160773
initialActions101011
loadScripts16191402207719318262077
setupStore12636757166111757
numNetworkReqs1406131876229318

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Update 13.9.0 changelog based on new cherry-picks

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37793?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
@metamaskbot
Copy link
Collaborator Author

Builds ready [5ac92b7]
UI Startup Metrics (1222 ± 89 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1222106514548912721405
load105291912498211111204
domContentLoaded104691612448111071196
domInteractive211486141861
firstPaint69888125741210631156
backgroundConnect2282172496230239
firstReactRender25184252637
getState22694122342
initialActions001001
loadScripts824693101480885965
setupStore1062831118
numNetworkReqs1367620674
BrowserifyPower User HomeuiStartup21491890308425421783084
load1074934149214711531492
domContentLoaded1059912146814511341468
domInteractive341772206472
firstPaint504171149043010331490
backgroundConnect2422292558250255
firstReactRender35255584155
getState21815836360231363
initialActions001011
loadScripts83369012361439181236
setupStore22855122755
numNetworkReqs1228420241165202
WebpackStandard HomeuiStartup8206971148958191091
load60455494284597873
domContentLoaded59754992581591855
domInteractive161166101334
firstPaint21357928213207790
backgroundConnect241168142557
firstReactRender28185873334
getState1153041217
initialActions001001
loadScripts59454791578588842
setupStore1152431216
numNetworkReqs1367719871
WebpackPower User HomeuiStartup12971115191223815511912
load656565967132791967
domContentLoaded644555944127777944
domInteractive31131533657153
firstPaint36262947261568947
backgroundConnect50102716372271
firstReactRender26242812628
getState1429417323153173
initialActions001001
loadScripts639553933124766933
setupStore1062861328
numNetworkReqs1096922052165220
FirefoxBrowserifyStandard HomeuiStartup14381242211213614891663
load1225107714729212891424
domContentLoaded1225107614729212891424
domInteractive1073437156115231
firstPaint------
backgroundConnect45271262150101
firstReactRender25214742629
getState64223613
initialActions001001
loadScripts1198105814528812661376
setupStore147214221130
numNetworkReqs1266314753
BrowserifyPower User HomeuiStartup33212454476274140744762
load15571269265933816862659
domContentLoaded15561269265933816862659
domInteractive331156910202438910
firstPaint------
backgroundConnect3678911233695541123
firstReactRender563790146190
getState14511020022156200
initialActions001011
loadScripts15021212262434116312624
setupStore13348815179126815
numNetworkReqs1436533887208338
WebpackStandard HomeuiStartup16071431231615816511972
load13731211173711414421606
domContentLoaded13731211173711414421605
domInteractive973148256108161
firstPaint------
backgroundConnect49231632552120
firstReactRender29227592940
getState84618817
initialActions001001
loadScripts13411172171610714091542
setupStore167227251252
numNetworkReqs1266816765
WebpackPower User HomeuiStartup39322814549382146075493
load19791550292045321662920
domContentLoaded19781549292045321652920
domInteractive395193941235446941
firstPaint------
backgroundConnect5057512374029361237
firstReactRender56407596175
getState17210631259202312
initialActions106216
loadScripts19291523288645521352886
setupStore22830838284151838
numNetworkReqs1457733391239333

@gauthierpetetin gauthierpetetin merged commit e0f129b into stable Nov 13, 2025
181 of 184 checks passed
@github-actions github-actions bot locked and limited conversation to collaborators Nov 13, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.9.0 Issue or pull request that will be included in release 13.9.0 team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.